/**
 *
 * @author Kenneth
 * Clase que realiza las operaciones en la Base de Datos para el modulo de autenticacion
 */

package capadatos;

import sistemaamd.ServiceResult;
import sistemaamd.ConstantesSP;
import sistemaamd.Pais;
import sistemaamd.SolicitudFinanciamiento;
import sistemaamd.Proyecto;

import java.util.ArrayList;
import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import proyectos.capalogica.ModuloProyectosBean;

public class ModuloSolicitudCapaDatos {

    //instancia del manejador
    private ManejadorBaseDatos manejadorBaseDatos;

    public ModuloSolicitudCapaDatos() {
        //se inicializa la instancia del manejador
        this.manejadorBaseDatos = new ManejadorBaseDatos();
    }

    /**
     * obtiene el estado de error del manejador
     * @return
     */
    public Boolean getExisteError() {
        return this.manejadorBaseDatos.getExisteError();
    }

    /**
     * obtiene el mensaje de error del manejador
     * @return
     */
    public String getMensajeError() {
        return this.manejadorBaseDatos.getDescripcionError();
    }

    //Consulta para autenticar usuario de la BD haciendo consulta con SP
    public ServiceResult obtenerPaises() {
        ServiceResult resultado;
        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_OBTENER_PAISES);
            boolean esResultSet=calls.execute();
            
            ArrayList<Pais> listaPaises = new ArrayList<Pais>();
            if (esResultSet){
                rs=calls.getResultSet();
                if (!rs.wasNull()){
                    while(rs.next()){
                        int id=rs.getInt(ConstantesSP.RETURN_OBTENER_PAISES_ID);
                        String nombre = rs.getString(ConstantesSP.RETURN_OBTENER_PAISES_NOMBRE);

                        Pais pais=new Pais(id,nombre);
                        listaPaises.add(pais);
                    }
                    resultado.setValorResultado(listaPaises);
                    rs.close();
                }
                else {
                    resultado = new ServiceResult("ERROR: Resultset es null");
                }
            }
            else {
                resultado = new ServiceResult("ERROR: No hay Resultset");
            }
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    public ServiceResult obtenerSolicitudesPresentadas()
    {
        ServiceResult resultado;
        ResultSet rs;

        resultado = new ServiceResult();
        try{
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_OBTENER_SOLICITUDES);
            boolean esResultSet=calls.execute();

            ArrayList<SolicitudFinanciamiento> listaSolicitud = new ArrayList<SolicitudFinanciamiento>();
            if (esResultSet){
                rs=calls.getResultSet();
                if (!rs.wasNull()){
                    while(rs.next()){
                        int id = rs.getInt(ConstantesSP.RETURN_OBTENER_SOLICITUDES_ID);
                        String codigo = rs.getString(ConstantesSP.RETURN_OBTENER_SOLICITUDES_CODIGO);
                        Proyecto proy = (Proyecto)(new ModuloProyectosBean().ObtenerProyecto(rs.getInt(ConstantesSP.RETURN_OBTENER_SOLICITUDES_PROYECTO)).getValorResultado().get(0));
                        Date fechaIni = rs.getDate(ConstantesSP.RETURN_OBTENER_SOLICITUDES_FECHA_INI);
                        Date fechaFin = rs.getDate(ConstantesSP.RETURN_OBTENER_SOLICITUDES_FECHA_INI);

                        SolicitudFinanciamiento solicitud=new SolicitudFinanciamiento(id, codigo, proy, fechaIni, fechaFin);
                        listaSolicitud.add(solicitud);
                    }
                    resultado.setValorResultado(listaSolicitud);
                    rs.close();
                }
                else {
                    resultado = new ServiceResult("ERROR: Resultset es null");
                }
            }
            else {
                resultado = new ServiceResult("ERROR: No hay Resultset");
            }
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    //Consulta para cargar proyectos de RProy
    public ServiceResult obtenerSolicitudesRProy(int idUsuario)
    {
        ServiceResult resultado;

        //variable del resultado final
        resultado = new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_OBTENER_SOLICITUDES_RPROY);
            calls.setInt(ConstantesSP.PARAM_OBTENER_SOLICITUDES_RPROY_IDUSUARIO, idUsuario);
            boolean esResultSet=calls.execute();

            ArrayList<SolicitudFinanciamiento> listaSolicitud = new ArrayList<SolicitudFinanciamiento>();
            if (esResultSet){
                rs=calls.getResultSet();
                if (!rs.wasNull()){
                    while(rs.next()){
                        int id = rs.getInt(ConstantesSP.RETURN_OBTENER_SOLICITUDES_RPROY_ID);
                        String codigo = rs.getString(ConstantesSP.RETURN_OBTENER_SOLICITUDES_RPROY_CODIGO);

                        SolicitudFinanciamiento solicitud=new SolicitudFinanciamiento(id, codigo);
                        listaSolicitud.add(solicitud);
                    }
                    resultado.setValorResultado(listaSolicitud);
                    rs.close();
                }
                else {
                    resultado = new ServiceResult("ERROR: Resultset es null");
                }
            }
            else {
                resultado = new ServiceResult("ERROR: No hay Resultset");
            }
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }

    //Consulta para insertar una parte de las solicitudes
    public ServiceResult insertarSolicitudParcial(int idSolicitud,String codigo,int idProyecto,Date fechaInicio,Date fechaFinal,int idUsuario,int idPais,String objetivos)
    {
        ServiceResult resultado= new ServiceResult();
        ResultSet rs;
        try {
            //this.manejadorBaseDatos.getConnection().setAutoCommit(false);
            CallableStatement calls = this.manejadorBaseDatos.getConnection().prepareCall(ConstantesSP.SP_INSERTAR_SOLICITUD_PARCIAL);
            calls.setInt(ConstantesSP.PARAM_INSERTAR_SOLICITUD_PARCIAL_IDSOLICITUD, idSolicitud);
            calls.setString(ConstantesSP.PARAM_INSERTAR_SOLICITUD_PARCIAL_CODIGO, codigo);
            calls.setInt(ConstantesSP.PARAM_INSERTAR_SOLICITUD_PARCIAL_IDPROYECTO, idProyecto);
            calls.setDate(ConstantesSP.PARAM_INSERTAR_SOLICITUD_PARCIAL_FECHA_INICIO, (java.sql.Date)fechaInicio);
            calls.setDate(ConstantesSP.PARAM_INSERTAR_SOLICITUD_PARCIAL_FECHA_FINAL, (java.sql.Date)fechaFinal);
            calls.setInt(ConstantesSP.PARAM_INSERTAR_SOLICITUD_PARCIAL_IDUSUARIO, idUsuario);
            calls.setInt(ConstantesSP.PARAM_INSERTAR_SOLICITUD_PARCIAL_IDPAIS, idPais);
            calls.setString(ConstantesSP.PARAM_INSERTAR_SOLICITUD_PARCIAL_OBJETIVOS, objetivos);
            int result=calls.executeUpdate();

            if (result<0){
                    resultado = new ServiceResult("ERROR: Insercion fallida");
            }
            calls.close();
        }
        catch (SQLException ex) {
            //System.out.println("ERROR: " + ex.getMessage());
            resultado = new ServiceResult("ERROR: " + ex.getMessage());
        }
        return resultado;
    }
}
